package com.neusoft.dibuy.lib.cl;

import java.util.*;
import java.util.function.Supplier;
import java.util.stream.IntStream;
import java.util.stream.Stream;

class Emp{
    String ename;
    int age;

    public Emp(String ename) {
        this.ename = ename;
    }
    public Emp( ) {

    }

    @Override
    public String toString() {
        return "Emp{" +
                "ename='" + ename + '\'' +
                ", age=" + age +
                '}';
    }
}
class MyDept {
    String dname;

    public  List<Emp> les =new ArrayList<>();

    public MyDept(String dname) {
        this.dname = dname;
    }

    public MyDept() {

    }

    public String getDname() {
        return dname;
    }

    public void setDname(String dname) {
        this.dname = dname;
    }

    @Override
    public String toString() {
        return "MyDept{" +
                "dname='" + dname + '\'' +
                ", les=" + les +
                '}';
    }
}


public class MyStream {
    public static void main(String[] args) {
        Random random =new Random();
        List<Emp> les = new ArrayList<>();
        les.add(new Emp("张三"));
        les.add(new Emp("李四"));
        les.add(new Emp("王五"));
        les.add(new Emp("赵六"));
        les.stream()
                .forEach(emp -> {
                    emp.age = random.nextInt(50);
                });
        les.stream()
                .forEach(emp -> System.out.println(emp));

//        Emp emp  = les.stream()
//                .reduce(new Emp(), (e1, e2) -> {
//                    e1.age += e2.age;
//                    return e1;
//                });
//        System.out.println(emp);
        Integer i = les.stream()
                .reduce(0, (sum, p) -> sum += p.age, (sum1, sum2) -> sum1 + sum2);
        System.out.println(i);


    }
    public static void main4(String[] args) {
        List<MyDept> lds =new ArrayList<>();
        IntStream.range(1, 4)
                .forEach( index ->  lds.add(new MyDept( "Index:" + index  ))  );

        lds.stream().forEach( myDept -> {
          IntStream.range(1, 4)
                  .forEach( index ->  {
                      myDept.les.add( new Emp(  myDept.getDname() + "empno" + index  ) );
                  });
        } );
        lds.stream()
                .flatMap( myDept -> myDept.les.stream())
                .forEach( emp -> System.out.println(emp));




//        List<Dept> lds = null;
//        Set<Dept> collect = Stream.of("7-aa-bb", "9-bb-bb", "6-aa-bb", "2-cc-bb", "5-aa-bb", "1-dd-bb")
//                .map(Dept::new)
////                .collect(Collectors.toList());
//                .collect(Collectors.toSet());
//        for ( Dept d :  collect  ){
//            System.out.println(d);
//        }
    }




    public static void main3(String[] args) {
        /**
         * TODO source 三种
         * 1、new ArrayList（）；
         * 2、Arrays.asList（）；
         * 3、Stream.of（）；
         *
         */
//        List<String> myList = new ArrayList<>(); //  Arrays.asList("a1", "a2", "b1", "c2", "c1");
//        myList.stream()
//                .findFirst()
//                .ifPresent(System.out::println);
//        Stream.of("a1", "a2", "b1", "c2", "c1")
//                .findFirst()
//                .ifPresent(System.out::println);
//        IntStream.range(1, 10)  //
//                .filter(i -> i % 2 == 1)
//                .forEach(System.out::println);
//        IntStream.range(1, 10)
//                .average()
//                        .ifPresent(System.out::println);

//                .sum();
//        System.out.println(sum );
//        Stream.of("10-研发部-沈阳市","20-研发部-沈阳市","30-研发部-沈阳市")
//                .map(
//                        /**
//                         * TODO :Map
//                         * 1、元素的个数是相同的
//                         * 2、类型可以不同
//                         * 3、完成一次数据计算（类型转换）
//                         */
//                        s ->  new Dept(s)
//                ).map(dept -> {
//                    System.out.println("MyStream.main  0------ > map");
//                    return  dept.getDeptno();
//                })
//                .forEach(System.out::println);
//        Stream.of("a1", "a2", "b1", "c2", "c1")
//                .map(  s -> s.substring(1))
//                .mapToInt(s -> Integer.parseInt(s)) // 即切换了数据类型，又切换了管道
//                .max()
//                .ifPresent(System.out::println);
//        Stream.of("10-研发部-沈阳市","20-研发部-沈阳市","30-研发部-沈阳市")
//        Stream.of("10-研发部-沈阳市","20-研发部-沈阳市","30-研发部-沈阳市")
//                .map( s -> s)
//                .mapToObj();
//       IntStream, LongStrem, DoubleStream
//        IntStream.range(1, 4)
//                .mapToObj(i -> "a" + i) // for 循环 1->4, 拼接前缀 a
//                .forEach(System.out::println); // for 循环打印
//        IntStream.range(1, 4)
//                .mapToObj(i -> i+"abc")
//                .forEach(System.out::println);
//        Stream.of(1.0, 2.0, 3.0)
//                .mapToInt(data  -> data .intValue() )
//                .mapToObj(data ->  data +"")
//                .forEach(System.out::println);
//        Stream.of("d2", "a2", "b1", "b3", "c")
//                .filter(s -> {
//                    System.out.println("filter: " + s);
//                    return true;
//                });
//        System.out.println("MyStream.main");
//        Stream.of("d2", "a2", "b1", "b3", "c")
//                .filter(s -> {
//                    System.out.println("filter: " + s);
//                    return true;
//                })
//                .forEach(s -> System.out.println("forEach: " + s));
//        Stream.of("d2", "a2", "b1", "b3", "c")
//                .map(s -> {
//                    System.out.println("map: " + s);
//                    return s.toUpperCase(); // 转大写
//                })
//                .filter(s -> {
//                    System.out.println("filter: " + s);
//                    return s.startsWith("A"); // 过滤出以 A 为前缀的元素
//                })
//                .forEach(s -> System.out.println("forEach: " + s)); // for 循环输出

//        Stream.of("d2", "a2", "b1", "b3", "c","asdfasd","sdfasdfasd")
//                .filter(s ->  s.length()<3)
//                .map(s -> {
//                    System.out.println("map: " + s);
//                    return s.toUpperCase(); // 转大写
//                })
//                .filter(s -> {
//                    System.out.println("filter: " + s);
//                    return s.startsWith("A"); // 过滤出以 A 为前缀的元素
//                })
//                .filter(s -> {
//                    System.out.println("filter2: " + s);
//                    int  i  =  s.charAt( s.length()-1 );
//                    return   i % 2 == 0;
//                })
//
//                .forEach(s -> System.out.println("forEach: " + s)); // for 循环输出


//        Stream.of("12", "13", "22", "23", "245","11111","3")
//                .sorted()  //
//                .forEach( s -> System.out.println("forEach: " + s));
//        Stream.of(4,12,3,4,1,234,234,5,456,456,567)
//                .sorted()
//                .forEach(s -> System.out.println("forEach: " + s));

//        Stream.of("12", "13", "22", "23", "245","11111","3")
//                .sorted(  ( o1,o2) ->  o2.length() -  o1.length()  )
//                .forEach(s -> System.out.println("forEach: " + s));
//
//        String [] ss = {"12", "13", "22", "23", "245","11111","3"   };
//        for (int i = ss.length-2; i < 0 ; i++) {
//            for (int j = 0; j < i  ; j++) {
//                if( f( ss[j] , ss[j+1] ) ){
//                    int empt = xxx;
//                    ss[j] = ss[j+1];
//                    ss[j+1] = empt;
//                }
//            }
//        }
//        Stream.of("7-aa-bb","9-bb-bb","6-aa-bb","2-cc-bb","5-aa-bb","1-dd-bb")
//                .map( s -> new Dept(s) )
////                .sorted( ( d1,d2 )->  d1.getDeptno() -  d2.deptno    )
////                .sorted()
//                .sorted((d1,d2)-> d1.getDname().compareTo(d2.getDname()) )
//                .forEach(System.out::println);

//        Stream.of("d2", "a2", "b1", "b3", "c")
//                .sorted((s1, s2) -> {
//                    System.out.printf("sort: %s; %s\n", s1, s2);
//                    return s1.compareTo(s2); // 排序
//                }) // 有状态的算子，需要缓冲所有的源数据
//                .filter(s -> {
//                    System.out.println("filter: " + s);
//                    return s.startsWith("a"); // 过滤出以 a 为前缀的元素
//                })
//                .map(s -> {
//                    System.out.println("map: " + s);
//                    return s.toUpperCase(); // 转大写
//                })
//                .forEach(s -> System.out.println("forEach: " + s)); // for 循环输出
//        正常情况流对象是一次性的，不能重复使用。
//        Stream<String> stream =
//                Stream.of("d2", "a2", "b1", "b3", "c")
//                        .filter(s -> s.startsWith("a"));

//        stream.forEach(System.out::println);
//
//        stream.forEach(System.out::println);

        Supplier<Stream<String>> streamSupplier =
                () -> Stream.of("d2", "a2", "b1", "b3", "c")
                        .filter(s -> s.startsWith("a"));

        streamSupplier.get().forEach(System.out::println);
        boolean b =  streamSupplier.get().anyMatch(s -> s.startsWith("a"));
        System.out.println(b );

        streamSupplier.get().forEach(System.out::println);


    }

    public static void main1(String[] args) {
        List<String> myList = Arrays.asList("a1", "a2", "b1", "c2", "c1");
//        开始构建管道
//        myList   //  数据源
//                .stream()   //  从数据源开始接出
//                .filter(   //  但是类型推断失败的情况
//                    s ->  s.endsWith("2")
//                )
//                .forEach(System.out::println);// 收集器
//        禁止使用流式
//        myList.stream()
//                .filter(s -> s.startsWith("c"))
//                .map( s -> {
//                    System.out.println("MyStream.main  0------ > map");
//                    return  s.toUpperCase();
//                });
//                .forEach(System.out::println);
    }
}
class  Dept implements  Comparable<Dept>{
    int deptno;
    String dname;
    String loc;

    public int getDeptno() {
        return deptno;
    }

    public void setDeptno(int deptno) {
        this.deptno = deptno;
    }

    public String getDname() {
        return dname;
    }

    public void setDname(String dname) {
        this.dname = dname;
    }

    public String getLoc() {
        return loc;
    }

    public void setLoc(String loc) {
        this.loc = loc;
    }

    public Dept(int deptno, String dname, String loc) {
        this.deptno =  deptno;
        this.dname = dname;
        this.loc = loc;
    }
    public Dept(String deptno, String dname, String loc) {
        this.deptno = Integer.valueOf(deptno) ;
        this.dname = dname;
        this.loc = loc;
    }
    public Dept(String  info ) {

        String[] ss = info.split("-");
        this.deptno = Integer.valueOf(ss[0]) ;
        this.dname = ss[1];
        this.loc = ss[2];
    }

    @Override
    public String toString() {
        return "Dept{" +
                "deptno=" + deptno +
                ", dname='" + dname + '\'' +
                ", loc='" + loc + '\'' +
                '}';
    }

    @Override
    public int compareTo(Dept dept) {
        return    this.getDeptno() - dept.getDeptno() ;
    }
}
